// take: 监听并等待一个 action
// takeEvery: 监听每一个匹配的 action
// takeLatest: 监听最新的 action，取消之前未完成的，相当于节流了
// throttle: 节流，控制的是监听的saga，在指定时间内只执行一次,执行多次
// debounce: 防抖，控制的是监听的saga，延迟指定时间后执行,执行一次
// put: 派发一个 action
// call: 调用一个函数
// select: 选择一个 state
// fork: 创建一个异步任务
// delay: 延迟指定时间
// all: 并行执行多个任务
// takeLeading: 监听最新的 action，取消之前未完成的
// apply: 调用一个函数
import {
	take,
	takeEvery,
	takeLatest,
	throttle,
	debounce,
	put,
	call,
	select,
	fork,
	delay,
	all,
	takeLeading,
	apply
} from 'redux-saga/effects'
import { COUNT_NUM, SAGA_TYPE, VOTE_SUP, VOTE_OPP } from './actionTypes'
import { countAction, voteAction } from './actions'
const api = {
	queryGoodsData (id, name) {
		console.log('查询商品数据接口', id, name)
		return new Promise((resolve, reject) => {
			setTimeout(() => {
				let result = {
					code: 0,
					msg: 'success',
					data: ['商品1', '商品2', '商品3']
				}
				resolve(result)
			}, 2000)
		})
	},
	queryBannerData () {
		console.log('查询轮播图数据接口')
		return new Promise((resolve, reject) => {
			setTimeout(() => {
				resolve({ code: 0, msg: 'success', data: ['轮播图1', '轮播图2', '轮播图3'] })
			}, 2000)
		})
	}
}

//创建工作saga,action为派发的action
const workingCount = function* (action) {
	// yield delay(2000) //延迟2秒
	// let { code, data } = yield apply(null, api.queryGoodsData, [1, 'malu'])
	// console.log('获取商品数据成功：', code, data)
	// let { code: code2, data: data2 } = yield apply(null, api.queryBannerData, [])
	// console.log('获取轮播图数据成功：', code2, data2)
	// // let { code, data } = yield call(api.queryGoodsData, 1, 'malu')
	// // console.log('获取数据成功：', code, data)

	// let [goodsData, bannerData] = yield all([
	// 	call(api.queryGoodsData, 1, 'malu'),
	// 	call(api.queryBannerData)
	// ])

	// Promise.all([
	// 	yield api.queryGoodsData(1, 'malu'),
	// 	yield api.queryBannerData()
	// ]).then(([goodsData, bannerData]) => {
	// 	console.log('获取数据成功：', goodsData, bannerData)
	// })

	// console.log('获取数据成功：', goodsData, bannerData)
	yield delay(1000)
	yield put(countAction.countAction.countNum(10))
	// let { count } = yield select(state => state.count)
	// console.log('当前派发的任务被监听到了', count, action)
}

const workingSup = function* (action) {
	yield delay(1000)
	yield put(voteAction.voteSup(5))
}

const workingOpp = function* (action) {
	yield delay(1000)
	yield put(voteAction.voteOpp(5))
}

// 创建一个监听器 Generator 函数作为根 Saga
const saga = function* () {
	// yield take('COUNT_NUM') 会暂停 Generator 执行
	// 直到监听到一个类型为 'COUNT_NUM' 的 action 被派发
	// take 是一次性的，监听到一次后就结束
	// takeEvery等价于	while (true) {
	// 	const action = yield take(COUNT_NUM + SAGA_TYPE)
	// 	yield workingCount(action)
	// }
	// yield debounce(2000, COUNT_NUM + SAGA_TYPE, workingCount)
	// yield throttle(2000, COUNT_NUM + SAGA_TYPE, workingCount)
	yield takeLatest(COUNT_NUM + SAGA_TYPE, workingCount)
	yield takeLatest(VOTE_SUP + SAGA_TYPE, workingSup)
	yield takeLatest(VOTE_OPP + SAGA_TYPE, workingOpp)

	// yield takeLatest(COUNT_NUM + SAGA_TYPE, workingCount)

	// while (true) {
	// 	const action = yield take(COUNT_NUM + SAGA_TYPE)
	// 	yield workingCount(action)
	// }

}

// 导出根 Saga 供 Store 使用
export default saga 